using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.BulletX
{
	/// <summary>
	/// MinkowskiSumShape represents implicit (getSupportingVertex) based minkowski sum of two convex implicit shapes.
	/// </summary>
	public class MinkowskiSumShape : ConvexShape
	{
		private Matrix _transformA;
		private Matrix _transformB;
		private ConvexShape _shapeA;
		private ConvexShape _shapeB;

		public MinkowskiSumShape(ConvexShape shapeA, ConvexShape shapeB)
		{
			_shapeA = shapeA;
			_shapeB = shapeB;
			_transformA = Matrix.Identity;
			_transformB = Matrix.Identity;
		}

		public Matrix TransformA { get { return _transformA; } set { _transformA = value; } }
		public Matrix TransformB { get { return _transformB; } set { _transformB = value; } }
		public ConvexShape ShapeA { get { return _shapeA; } }
		public ConvexShape ShapeB { get { return _shapeB; } }

		public override float Margin
		{
			get
			{
				return _shapeA.Margin + _shapeB.Margin;
			}
			set
			{
				base.Margin = value;
			}
		}

		public override BroadphaseNativeTypes ShapeType
		{
			get
			{
				return BroadphaseNativeTypes.MinkowskiDifference;
			}
		}

		public override string Name
		{
			get
			{
				return "MinkowskiSum";
			}
		}

		public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec)
		{
			Vector3 supVertexA = MathHelper.MatrixToVector(_transformA, _shapeA.LocalGetSupportingVertexWithoutMargin(Vector3.TransformNormal(vec, _transformA)));
			Vector3 supVertexB = MathHelper.MatrixToVector(_transformB, _shapeB.LocalGetSupportingVertexWithoutMargin(Vector3.TransformNormal(vec, _transformB)));
			return supVertexA + supVertexB;
		}

		public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut)
		{
			for (int i = 0; i < vectors.Length; i++)
				supportVerticesOut[i] = LocalGetSupportingVertexWithoutMargin(vectors[i]);
		}

		public override void CalculateLocalInertia(float mass, out Vector3 inertia)
		{
			inertia = new Vector3();
			BulletDebug.Assert(false);
		}
	}
}
